#include <stdio.h>
#include <string.h>
#include "All_struct.h" 
#include "Restaurant.h"

// 0. 初始化餐馆
void Restaurant_init(Restaurant * pR){
	//空指针异常处理
	if(pR == NULL){
		printf("当前指针为空！\n");
		return;
	}
	//对餐馆名称初始化防止餐馆名词乱码
	strncpy(pR->restaurant_name, "暂未命名", sizeof(pR->restaurant_name) - 1);
	pR->restaurant_name[sizeof(pR->restaurant_name) - 1] = '\0';
	//初始化窗口数量为1
	pR->window_count = 0;
}
// 1. 修改餐馆名称（改名功能）
void Restaurant_set_name(Restaurant *pR, const char *new_name){
	//对空指针进行异常处理
	if(pR == NULL){
		printf("当前指针为空！\n");
		return;
	}
	//对新名称空参进行异常处理
	if(new_name == NULL) {
		printf("输入名称为空！\n");
		return;
	}
	//使用string自带库函数进行名称覆盖
	strncpy(pR->restaurant_name, new_name, sizeof(pR->restaurant_name) - 1);
	//最后一位留存为休止符
	pR->restaurant_name[sizeof(pR->restaurant_name) - 1] = '\0';
}
// 2. 打印餐馆概览（名称、窗口数量、营业窗口数）  
void Restaurant_show_overview(Restaurant *pR){
	//对空指针进行异常处理
	if(pR == NULL){
		printf("当前指针为空！\n");
		return;
	}	
	//对餐馆信息进行打印
	printf("餐厅名称：%s\n", pR->restaurant_name);
	printf("餐厅窗口数量：%d\n", pR->window_count);
	int open_counts = 0;
	for(int i = 0; i < pR->window_count; i++){
		if(pR->windows[i].window_state == 1)
			open_counts++;
	}
	printf("当前营业窗口数：%d\n", open_counts);
}
// 16. 统计餐馆总菜品数量  
int Restaurant_calc_total_dishes(Restaurant *pR){
	//对空指针进行异常处理
	if(pR == NULL){
		printf("当前指针为空！\n");
		return 0;
	}		
	//窗口结构体中window_count可直接调用，防止两重循环过于驳杂
	int all_count = 0;
	for(int i = 0; i < pR->window_count; i++){
		all_count += pR->windows[i].dish_count;
				
	}
	printf("当前餐馆总菜品数量为：%d\n", all_count);
	return all_count;	
}	
// 17. 窗口库存预警,阈值参数为传入的threshold,返回值0为安全 1为危险
int Window_stock_warning(Window *pWin, int threshold){
	//对空指针进行异常处理
	if(pWin == NULL) {
		printf("当前窗口为空！\n");
		return 0;
	}
	//定义窗口状态，若循环后始终为0则窗口安全
	int state_dishes = 0;
	for(int i = 0; i < pWin->dish_count; i++){
		if(pWin->dishes[i].stock <= threshold){
		printf("当前%s菜品数量低于阈值，还剩%d道\n", pWin->dishes[i].name, pWin->dishes[i].stock);
		//只要有一道菜预警便设置为预警状态
		state_dishes = 1;
		}
	}
	if(!state_dishes) printf("菜品数量都很充足，不必担心！\n");
	return state_dishes;
}	
// 18. 计算单个窗口营业额 
float Window_calc_revenue(Window *pWin){
	//对空窗口进行处理
	if(NULL == pWin ) {
		printf("当前窗口为空！\n");
		return 0;
	}
	//对菜品种类数量为空进行处理
	if( pWin->order_count == 0){
		printf("当前窗口菜品数量为0！\n");
	}
	//定义当前窗口营业额
	float money_dishes = 0;
	for(int i = 0; i < pWin->order_count; i++){
		//对每个订单菜品的价格和数量进行累加
		money_dishes+= (pWin->Orders[i].price) * (pWin->Orders[i].stock);	
	}
	//只输出两位符合常识
	printf("您的窗口目前盈利%.2f元\n", money_dishes);
	return money_dishes;
}
// 19. 计算整个餐馆营收
float Restaurant_Window_calc_revenue(Restaurant * pR){
	//对空指针进行异常处理
	if(NULL == pR) {
		printf("当前指针为空！\n");
		return 0;
	}
	//定义餐馆总营收
	float all_rest_money = 0;
	for(int i = 0; i < pR->window_count; i++){
	for(int j = 0; j < pR->windows[i].order_count; j++){
		//遍历每个窗口的每个订单赚取钱数
		all_rest_money += (pR->windows[i].Orders[j].price) 
			* (pR->windows[i].Orders[j].stock);	
	}
	}
	//只输出两位符合毛分计量单位
	printf("截至目前您的餐馆营收为：%.2f元\n", all_rest_money);
	return all_rest_money;
}
// 新增：保存餐馆数据到二进制文件
int save_restaurant(Restaurant *pR, const char *file_path) {
    if (pR == NULL || file_path == NULL) {
        printf("错误：参数无效，无法保存数据！\n");
        return 0;
    }

    // 以“二进制+覆盖写”模式打开文件（无文件则创建，有文件则覆盖）
    FILE *fp = fopen(file_path, "wb");
    if (fp == NULL) {
        perror("错误：文件打开失败"); // 提示具体错误（如权限不足）
        return 0;
    }

    // 写入整个Restaurant结构体（含所有窗口、菜品、订单，因是固定数组无指针）
    size_t write_size = fwrite(pR, sizeof(Restaurant), 1, fp);
    fclose(fp); // 必须关闭文件，避免数据残留

    if (write_size == 1) {
        printf("数据保存成功！文件路径：%s\n", file_path);
        return 1;
    } else {
        printf("错误：数据保存不完整！\n");
        return 0;
    }
}

// 新增：从二进制文件加载餐馆数据
int load_restaurant(Restaurant *pR, const char *file_path) {
    if (pR == NULL || file_path == NULL) {
        printf("错误：参数无效，无法加载数据！\n");
        return 0;
    }

    // 以“二进制+只读”模式打开文件（无文件则返回失败）
    FILE *fp = fopen(file_path, "rb");
    if (fp == NULL) {
        printf("未找到历史数据文件，将初始化新餐馆！\n");
        Restaurant_init(pR); // 无文件时初始化默认餐馆
        return 0;
    }

    // 读取文件数据到Restaurant结构体
    size_t read_size = fread(pR, sizeof(Restaurant), 1, fp);
    fclose(fp);

    if (read_size == 1) {
        printf("数据加载成功！已恢复历史餐馆信息\n");
        return 1;
    } else {
        printf("错误：数据文件损坏，将初始化新餐馆！\n");
        Restaurant_init(pR); // 文件损坏时初始化默认餐馆
        return 0;
    }
}